#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
练习题27: 迭代器协议(__iter__, __next__)和生成器表达式练习

知识点:
- 迭代器协议的实现
- 生成器函数和yield关键字
- 生成器表达式
- itertools模块的使用
- 自定义可迭代对象
- 无限迭代器
- 协程和yield from
- 异步生成器

难度: ★★★☆☆
"""

import itertools
import random
import time
from typing import Iterator, Iterable, Generator, Any, Optional
from collections.abc import Iterator as ABCIterator


# =============================================================================
# 1. 基础迭代器实现
# =============================================================================

class NumberSequence:
    """
    数字序列迭代器
    
    TODO: 实现数字序列的迭代器
    - 支持起始值、结束值和步长
    - 实现__iter__和__next__方法
    - 处理迭代结束的StopIteration异常
    """
    
    def __init__(self, start: int, end: int, step: int = 1):
        self.start = start
        self.end = end
        self.step = step
        self.current = start
    
    def __iter__(self):
        # TODO: 返回迭代器对象
        pass
    
    def __next__(self):
        # TODO: 返回下一个值或抛出StopIteration
        pass


class FibonacciIterator:
    """
    斐波那契数列迭代器
    
    TODO: 实现斐波那契数列迭代器
    - 生成无限的斐波那契数列
    - 支持限制生成数量
    - 优化内存使用
    """
    
    def __init__(self, max_count: Optional[int] = None):
        self.max_count = max_count
        self.count = 0
        self.a, self.b = 0, 1
    
    def __iter__(self):
        # TODO: 返回迭代器对象
        pass
    
    def __next__(self):
        # TODO: 生成下一个斐波那契数
        pass


class ReverseIterator:
    """
    反向迭代器
    
    TODO: 实现任意序列的反向迭代
    - 支持任何可索引的序列
    - 从末尾开始迭代
    """
    
    def __init__(self, sequence):
        self.sequence = sequence
        self.index = len(sequence)
    
    def __iter__(self):
        # TODO: 返回迭代器对象
        pass
    
    def __next__(self):
        # TODO: 反向返回元素
        pass


# =============================================================================
# 2. 自定义可迭代容器
# =============================================================================

class CircularList:
    """
    循环列表
    
    TODO: 实现循环列表容器
    - 支持无限循环迭代
    - 支持添加和删除元素
    - 支持指定循环次数
    """
    
    def __init__(self, items=None):
        self.items = list(items) if items else []
    
    def add(self, item):
        # TODO: 添加元素
        pass
    
    def remove(self, item):
        # TODO: 删除元素
        pass
    
    def __iter__(self):
        # TODO: 返回循环迭代器
        pass
    
    def cycle(self, times: int):
        # TODO: 返回指定次数的循环迭代器
        pass


class TreeNode:
    """
    树节点类
    """
    def __init__(self, value, children=None):
        self.value = value
        self.children = children or []
    
    def add_child(self, child):
        self.children.append(child)


class Tree:
    """
    树结构
    
    TODO: 实现树的多种遍历迭代器
    - 深度优先遍历
    - 广度优先遍历
    - 前序、中序、后序遍历
    """
    
    def __init__(self, root: TreeNode):
        self.root = root
    
    def __iter__(self):
        # TODO: 默认深度优先遍历
        pass
    
    def depth_first(self):
        # TODO: 深度优先遍历迭代器
        pass
    
    def breadth_first(self):
        # TODO: 广度优先遍历迭代器
        pass
    
    def preorder(self):
        # TODO: 前序遍历迭代器
        pass


class Matrix:
    """
    矩阵类
    
    TODO: 实现矩阵的多种迭代方式
    - 按行迭代
    - 按列迭代
    - 按对角线迭代
    - 螺旋迭代
    """
    
    def __init__(self, rows: int, cols: int, data=None):
        self.rows = rows
        self.cols = cols
        self.data = data or [[0] * cols for _ in range(rows)]
    
    def __iter__(self):
        # TODO: 默认按行迭代
        pass
    
    def iter_by_row(self):
        # TODO: 按行迭代
        pass
    
    def iter_by_column(self):
        # TODO: 按列迭代
        pass
    
    def iter_diagonal(self):
        # TODO: 对角线迭代
        pass
    
    def iter_spiral(self):
        # TODO: 螺旋迭代
        pass


# =============================================================================
# 3. 生成器函数
# =============================================================================

def fibonacci_generator(max_count: Optional[int] = None) -> Generator[int, None, None]:
    """
    斐波那契数列生成器
    
    TODO: 使用生成器实现斐波那契数列
    - 使用yield关键字
    - 支持无限生成或限制数量
    """
    # TODO: 实现斐波那契生成器
    pass


def prime_generator(max_num: Optional[int] = None) -> Generator[int, None, None]:
    """
    质数生成器
    
    TODO: 实现质数生成器
    - 使用埃拉托斯特尼筛法或试除法
    - 支持无限生成或限制范围
    """
    # TODO: 实现质数生成器
    pass


def file_line_generator(filename: str) -> Generator[str, None, None]:
    """
    文件行生成器
    
    TODO: 实现大文件的逐行读取
    - 内存友好的文件读取
    - 自动处理文件关闭
    """
    # TODO: 实现文件行生成器
    pass


def batch_generator(iterable: Iterable, batch_size: int) -> Generator[list, None, None]:
    """
    批处理生成器
    
    TODO: 将可迭代对象分批处理
    - 将大数据集分成小批次
    - 支持任意可迭代对象
    """
    # TODO: 实现批处理生成器
    pass


def window_generator(iterable: Iterable, window_size: int) -> Generator[tuple, None, None]:
    """
    滑动窗口生成器
    
    TODO: 实现滑动窗口
    - 生成指定大小的滑动窗口
    - 支持重叠窗口
    """
    # TODO: 实现滑动窗口生成器
    pass


def random_data_generator(data_type: str = "int", count: int = 100) -> Generator[Any, None, None]:
    """
    随机数据生成器
    
    TODO: 生成各种类型的随机数据
    - 支持整数、浮点数、字符串等类型
    - 可配置数据范围和格式
    """
    # TODO: 实现随机数据生成器
    pass


# =============================================================================
# 4. 高级生成器技术
# =============================================================================

def coroutine_example() -> Generator[None, int, str]:
    """
    协程示例
    
    TODO: 实现简单的协程
    - 使用yield接收数据
    - 处理发送的值
    - 返回最终结果
    """
    # TODO: 实现协程逻辑
    pass


def delegating_generator(generators: list) -> Generator[Any, None, None]:
    """
    委托生成器
    
    TODO: 使用yield from委托给其他生成器
    - 串联多个生成器
    - 透明地传递值和异常
    """
    # TODO: 实现生成器委托
    pass


def pipeline_generator(*functions) -> Generator[Any, Any, None]:
    """
    管道生成器
    
    TODO: 实现数据处理管道
    - 串联多个处理函数
    - 支持数据流式处理
    """
    # TODO: 实现管道处理
    pass


def async_data_generator(urls: list) -> Generator[Any, None, None]:
    """
    异步数据生成器模拟
    
    TODO: 模拟异步数据获取
    - 模拟网络请求延迟
    - 生成异步获取的数据
    """
    # TODO: 实现异步数据生成
    pass


# =============================================================================
# 5. itertools模块应用
# =============================================================================

def demonstrate_itertools():
    """
    演示itertools模块的使用
    
    TODO: 展示itertools的各种功能
    - 无限迭代器: count, cycle, repeat
    - 终止迭代器: accumulate, chain, compress等
    - 组合迭代器: product, permutations, combinations
    """
    print("=" * 60)
    print("itertools模块演示")
    print("=" * 60)
    
    # TODO: 演示count, cycle, repeat
    print("\n1. 无限迭代器:")
    
    # TODO: 演示chain, compress, dropwhile等
    print("\n2. 终止迭代器:")
    
    # TODO: 演示product, permutations, combinations
    print("\n3. 组合迭代器:")


def custom_itertools_functions():
    """
    自定义itertools风格的函数
    
    TODO: 实现类似itertools的实用函数
    - take: 取前n个元素
    - drop: 跳过前n个元素
    - unique: 去重迭代器
    - pairwise: 成对迭代
    """
    
    def take(iterable: Iterable, n: int) -> Generator[Any, None, None]:
        # TODO: 实现take函数
        pass
    
    def drop(iterable: Iterable, n: int) -> Generator[Any, None, None]:
        # TODO: 实现drop函数
        pass
    
    def unique(iterable: Iterable) -> Generator[Any, None, None]:
        # TODO: 实现unique函数
        pass
    
    def pairwise(iterable: Iterable) -> Generator[tuple, None, None]:
        # TODO: 实现pairwise函数
        pass
    
    return take, drop, unique, pairwise


# =============================================================================
# 6. 性能优化和内存管理
# =============================================================================

class MemoryEfficientRange:
    """
    内存高效的范围迭代器
    
    TODO: 实现内存高效的大范围迭代
    - 不预先生成所有值
    - 支持超大范围
    - 优化内存使用
    """
    
    def __init__(self, start: int, stop: int, step: int = 1):
        self.start = start
        self.stop = stop
        self.step = step
    
    def __iter__(self):
        # TODO: 返回内存高效的迭代器
        pass
    
    def __len__(self):
        # TODO: 计算长度而不生成所有值
        pass
    
    def __getitem__(self, index):
        # TODO: 支持索引访问
        pass


class LazyList:
    """
    惰性列表
    
    TODO: 实现惰性求值的列表
    - 延迟计算元素值
    - 缓存已计算的值
    - 支持列表操作
    """
    
    def __init__(self, generator_func, *args, **kwargs):
        self.generator_func = generator_func
        self.args = args
        self.kwargs = kwargs
        self.cache = {}
        self.generator = None
    
    def __iter__(self):
        # TODO: 返回惰性迭代器
        pass
    
    def __getitem__(self, index):
        # TODO: 惰性获取元素
        pass
    
    def __len__(self):
        # TODO: 计算长度（可能需要完全求值）
        pass


# =============================================================================
# 7. 异步迭代器和生成器
# =============================================================================

class AsyncNumberGenerator:
    """
    异步数字生成器
    
    TODO: 实现异步迭代器
    - 使用__aiter__和__anext__
    - 模拟异步数据获取
    """
    
    def __init__(self, start: int, end: int, delay: float = 0.1):
        self.start = start
        self.end = end
        self.delay = delay
        self.current = start
    
    def __aiter__(self):
        # TODO: 返回异步迭代器
        pass
    
    async def __anext__(self):
        # TODO: 异步返回下一个值
        pass


async def async_file_reader(filename: str):
    """
    异步文件读取生成器
    
    TODO: 实现异步文件读取
    - 异步读取文件行
    - 模拟I/O延迟
    """
    # TODO: 实现异步文件读取生成器
    pass


async def async_data_processor(data_source):
    """
    异步数据处理器
    
    TODO: 实现异步数据处理
    - 异步处理数据流
    - 支持背压控制
    """
    # TODO: 实现异步数据处理
    pass


# =============================================================================
# 8. 演示函数
# =============================================================================

def demonstrate_basic_iterators():
    """
    演示基础迭代器
    """
    print("=" * 60)
    print("基础迭代器演示")
    print("=" * 60)
    
    # 1. 数字序列迭代器
    print("\n1. 数字序列迭代器:")
    # TODO: 使用NumberSequence迭代数字
    
    # 2. 斐波那契迭代器
    print("\n2. 斐波那契迭代器:")
    # TODO: 使用FibonacciIterator生成斐波那契数列
    
    # 3. 反向迭代器
    print("\n3. 反向迭代器:")
    # TODO: 使用ReverseIterator反向迭代


def demonstrate_custom_containers():
    """
    演示自定义可迭代容器
    """
    print("\n=" * 60)
    print("自定义可迭代容器演示")
    print("=" * 60)
    
    # 1. 循环列表
    print("\n1. 循环列表:")
    # TODO: 使用CircularList演示循环迭代
    
    # 2. 树遍历
    print("\n2. 树遍历:")
    # TODO: 创建树并演示不同遍历方式
    
    # 3. 矩阵迭代
    print("\n3. 矩阵迭代:")
    # TODO: 创建矩阵并演示不同迭代方式


def demonstrate_generators():
    """
    演示生成器函数
    """
    print("\n=" * 60)
    print("生成器函数演示")
    print("=" * 60)
    
    # 1. 斐波那契生成器
    print("\n1. 斐波那契生成器:")
    # TODO: 使用fibonacci_generator
    
    # 2. 质数生成器
    print("\n2. 质数生成器:")
    # TODO: 使用prime_generator
    
    # 3. 批处理生成器
    print("\n3. 批处理生成器:")
    # TODO: 使用batch_generator
    
    # 4. 滑动窗口生成器
    print("\n4. 滑动窗口生成器:")
    # TODO: 使用window_generator


def demonstrate_advanced_generators():
    """
    演示高级生成器技术
    """
    print("\n=" * 60)
    print("高级生成器技术演示")
    print("=" * 60)
    
    # 1. 协程示例
    print("\n1. 协程示例:")
    # TODO: 演示协程的使用
    
    # 2. 委托生成器
    print("\n2. 委托生成器:")
    # TODO: 演示yield from的使用
    
    # 3. 管道生成器
    print("\n3. 管道生成器:")
    # TODO: 演示数据处理管道


async def demonstrate_async_iterators():
    """
    演示异步迭代器
    """
    print("\n=" * 60)
    print("异步迭代器演示")
    print("=" * 60)
    
    # 1. 异步数字生成器
    print("\n1. 异步数字生成器:")
    # TODO: 使用AsyncNumberGenerator
    
    # 2. 异步文件读取
    print("\n2. 异步文件读取:")
    # TODO: 使用async_file_reader


def test_iterator_performance():
    """
    测试迭代器性能
    """
    print("\n=== 性能测试 ===")
    
    # TODO: 比较不同迭代器实现的性能
    # 1. 内存使用对比
    # 2. 执行时间对比
    # 3. 大数据集处理能力
    
    pass


def test_iterator_edge_cases():
    """
    测试迭代器边界情况
    """
    print("\n=== 边界情况测试 ===")
    
    # TODO: 测试各种边界情况
    # 1. 空迭代器
    # 2. 单元素迭代器
    # 3. 异常处理
    # 4. 重复迭代
    
    pass


if __name__ == "__main__":
    # 运行基础演示
    demonstrate_basic_iterators()
    
    # 运行容器演示
    demonstrate_custom_containers()
    
    # 运行生成器演示
    demonstrate_generators()
    
    # 运行高级演示
    demonstrate_advanced_generators()
    
    # 运行itertools演示
    demonstrate_itertools()
    
    # 运行异步演示
    import asyncio
    asyncio.run(demonstrate_async_iterators())
    
    # 运行测试
    test_iterator_performance()
    test_iterator_edge_cases()
    
    print("\n" + "=" * 60)
    print("练习提示:")
    print("1. 理解迭代器协议和生成器的区别")
    print("2. 掌握yield关键字的多种用法")
    print("3. 学会使用itertools模块提高效率")
    print("4. 了解异步迭代器的应用场景")
    print("5. 探索内存高效的迭代器设计模式")
    print("=" * 60)
